package classes;


import static org.junit.Assert.fail;


import java.awt.Robot;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Set;

import org.eclipse.jdt.internal.compiler.ast.AssertStatement;
import org.junit.Assert;
import org.openqa.selenium.By;

import org.openqa.selenium.ElementNotVisibleException;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.Keys;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.Point;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;

import org.openqa.selenium.ie.InternetExplorerDriver;

import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.interactions.HasInputDevices;
import org.openqa.selenium.interactions.Keyboard;
import org.openqa.selenium.internal.seleniumemulation.GetHtmlSource;

import cucumber.api.java.en.And;
import cucumber.api.java.en.Given;
import cucumber.api.java.en.Then;
import cucumber.api.java.en.When;
import cucumber.runtime.PendingException;

import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.ErrorHandler;
import org.openqa.selenium.remote.ErrorHandler.UnknownServerException;
import org.openqa.selenium.remote.server.handler.FindElement;
import org.openqa.selenium.remote.server.handler.GetAlertText;
import org.openqa.selenium.support.ui.Select;

import com.thoughtworks.selenium.Selenium;
import java.io.IOException;
import java.lang.Runtime;
public class Manobra {
	
	private WebDriver driver;
	
	String winHandleBefore;
	List<String> informaçõesDaLinha = new ArrayList<>(); 
	
//EX:  Given entra no site com url "http://www.jfm.qlix.com.br/"	
	@Given("^entra no site com url \"([^\"]*)\"$")
	public void entraNoSiteCom(String url) throws Throwable{
		
		//System.setProperty("webdriver.ie.driver", "C:/Users/jaks/Downloads/Programação/libs_Selenium/IEDriverServer.exe");
		//WebDriver driver = new InternetExplorerDriver();
		
		//System.setProperty("webdriver.chrome.driver", "C:/Users/jaks/Downloads/Programação/libs_Selenium/chromeDriver/chromedriver.exe");
		//WebDriver driver = new ChromeDriver();
				
		driver = new FirefoxDriver();
		//driver.manage().window().maximize(); //maximiza a tela
		
		driver.get(url); 
	}
	
	//Ex: And usuario preenche campo com o identificador "id_name_class_rua" e valor "Rua Timbiras"
			@Given ("^usuario preenche campo com o identificador \"([^\"]*)\" e valor \"([^\"]*)\"$")
			public void usuarioPreencheCampo (String identificador, String valor) throws Throwable {
				WebElement elemento = null;
				try{
					elemento = driver.findElement(By.xpath("//input[@id = '" + identificador + "']"));
				}catch (NoSuchElementException e) {
					try{
						elemento = driver.findElement(By.xpath("//input[@name = '" + identificador + "']"));
					}catch (NoSuchElementException ex) {
						try {
							elemento = driver.findElement(By.xpath("//input[@class = '" + identificador + "']"));
						} catch (NoSuchElementException exz) {
							fail("Não preencheu o valor : ( "+valor+ " ) - CAUSA: Não achou o elemento com identificador: " + identificador);
						}
					}	
				}
				elemento.click();
				elemento.sendKeys(valor);	
			}
			// Parametros do metodo: 
			//um identificador da tag <select> (id ou name ou class) e uma opcao (numero ou a palavra "aleatorio")
			//Ex: And usuario seleciona combobox com identificador "identificador_select" e opcao "aleatorio"
			@Given ("^usuario seleciona combobox com identificador \"([^\"]*)\" e opcao \"([^\"]*)\"$")
			public void selecionaComboboxComIdentificador (String identificador,String opcao) throws Throwable {
				Select combobox = null;
				List<WebElement> listaDeOpcoes = null;
				Random geradorAleatorio = new Random();
				Integer opcaoAleatoria = null;
				
				try{
					combobox = new Select( driver.findElement(By.xpath("//select[@id = '" + identificador + "']")));
				}catch (NoSuchElementException e) {
					try{
						combobox = new Select( driver.findElement(By.xpath("//select[@name = '" + identificador + "']")));
					}catch (NoSuchElementException ex) {
						try{
							combobox = new Select( driver.findElement(By.xpath("//select[@class = '" + identificador + "']")));
						}catch (NoSuchElementException exc) {
								fail("Não encontrou o combobox");
						}		
					}	
				}
				listaDeOpcoes = combobox.getOptions();
				
				//Armazena na opcaoAleatoria um numero aleatorio de 0 ao tamanho maximo da lista
				opcaoAleatoria = geradorAleatorio.nextInt(listaDeOpcoes.size());
				
				if ( opcao.equals("aleatorio")){
					combobox.selectByIndex( opcaoAleatoria );
				}else{
					try {
						combobox.selectByIndex( Integer.parseInt(opcao) );
					} catch (Exception e) {
						fail("Desenvolvedor o combobox só tem " + listaDeOpcoes.size() + "opções");
					}
					
				}
				
			}	
			
	@And ("^seleciona opcoes$")
	public void serlecionaOpcoes() throws Throwable {
		Select oSingleSelection = new Select(driver.findElement(By.id("single-selection")));
		//oSingleSelection.selectByVisibleText("August");
		
		Select oMulitpleSelection = new Select(driver.findElement(By.xpath("//select[@multiple='multiple' and @size=12]")));
		//Select oMulitpleSelection = new Select(driver.findElement(By.id("multi-selections")));
		
		List<WebElement> lista = oMulitpleSelection.getOptions();
		//System.out.println( "O tamanho da lista  : " +lista.size());
		
		oMulitpleSelection.selectByIndex(3); // April
	    oMulitpleSelection.selectByValue("Aug"); // Select <option ... value="Aug">...</option>
	    oMulitpleSelection.selectByVisibleText("November"); // Select <option ...>November</option>
	
	    //Actions action = null ;
	    
	    //action.keyDown( Keys.ENTER);
	    //action.key
	    //driver.findElement(By.whatever("anything")).sendKeys(selectAll);
	    
		//driver.findElement(By.id("single-selection")).sendKeys(Keys.ENTER);
	}
	
	//@Given("^usuario entrou no sistema com login\" (.+)\" e senha\"(.+)\"$" )
	@And("^existe os campos \"(.+)\"$")
	public void existeOsCampos ( List<String> lista )throws Throwable {
		for (String texto : lista) {
			
			visibilityOfText( texto );
			
		}
		//System.out.println("veja = " +verifyTextPresent("selected"));
		//visibilityOfText("ran");
	}
	
	public boolean verificaCampo(String text){
		return driver.getPageSource().contains(text);
		
	}
	public void visibilityOfText(String texto){
		
	    WebElement element = driver.findElement(By.cssSelector("body"));
		//WebElement element = driver.findElement(By.tagName("body"));
		
		boolean feedBack = driver.findElement(By.cssSelector("body")).getText().contains(texto);
	    boolean feedbackVisible = element.isDisplayed();
	    boolean feedbackTexto = driver.findElement(By.tagName("body")).getText().contains(texto);
	    
	    List<WebElement> tudo = driver.findElements(By.xpath("//*"));// da certo tb
	    //List<WebElement> tudo = element.findElements(By.xpath("//select/option"));
	    
	    boolean t = false;
	       int j = 0;
	  	   for (WebElement x : tudo) {
	  		   
			   if( x.getTagName().contains("fieldset")){
			   	   t = true;
			   	   //System.out.println( "Posição da tag fieldset :  " + j );
			   	JavascriptExecutor js = (JavascriptExecutor) driver;  
			   				   	
			   }
		  	   //System.out.println( "Olha as tags : \n " +  x.getTagName() + "\n"); 
			   j++;
	  	   }
	  	   
	  	   for (int i = 0; i < tudo.size(); i++) {
	  		 //System.out.println( "Olha as tags : \n " + tudo.get(i).getTagName() );
	  		   if ( tudo.get(i).getTagName() == "fieldset" ){
	  			// System.out.println( "Olha as tags : \n " + tudo.get(i).getTagName() );
	  		   }
		   }
	    //boolean t = txto.get(0).getText().contains(texto);
	    //System.out.println( "Olha o texto : " + txto.get(0).getText());
	    //System.out.println( "Olha o texto : " + txto.get(1).getTagName());
	    System.out.println( "Olha o texto : " + tudo.size());
	    System.out.println( "Olha BOSTA : " + tudo.get(6).getTagName());
	    if(feedBack==true){
	        System.out.println(texto+ " esta presente");
	        if(feedbackVisible==true){
	            System.out.println(texto+ "  visivel");
	        }
	        else{
	            System.out.println(texto+ "nao e visivel");
	        }

	    }
	    else{
	        System.out.println(texto+ " nao esta present");

	    }
	     if(t){
	    	 System.out.println(texto+ " Tem porra");
	     }else{
	    	 System.out.println(texto+ " Nao Tem porra");

	     }
	    
	  
	}
	
	@And("^procura no google a palavra \"([^\"]*)\"$")
	public void procura( String palavra) throws Throwable {
		
		//driver.findElement(By.id("gbqfq")).sendKeys(palavra);
		Keyboard keyboard = ((HasInputDevices) driver).getKeyboard();
	
		//keyboard.pressKey(Keys.ENTER); 
		//keyboard.sendKeys(Keys.ENTER);
		keyboard.pressKey(Keys.chord(Keys.CONTROL, "t","t"));
		//keyboard.pressKey(Keys.CONTROL + "t");
		
	}
	
	@And("^digita e seleciona a palavra \"([^\"]*)\"$")
	public void procuraPalavra( String palavra) throws Throwable {
		
		driver.findElement(By.id("gbqfq")).sendKeys(palavra);
		
		String selectAll = Keys.chord(Keys.CONTROL, "a");
		driver.findElement(By.id("gbqfq")).sendKeys(selectAll); 
	}

	
	
//EX 1:And clica no elemento "id" com valor "gbqfsb"
//EX 2:And clica no elemento "a" com valor "Soluções de publicidade"
	@And("^clica no elemento \"([^\"]*)\" com valor \"([^\"]*)\"$")
	public void clicaNoElementoComTexto (String elemento, String valor) throws Throwable {
		WebElement button;
		//button = driver.findElement(By.xpath("//button[@id = 'gbqfbb' and @name='btnI']"));
		//button = driver.findElement(By.xpath("//span[text() = 'Estou com sorte']"));
		
		try{
			button = driver.findElement(By.xpath("//"+elemento+"[text() = '" + valor + "']"));
		}catch (NoSuchElementException e) {
			try{
				button = driver.findElement(By.xpath("//"+elemento+"[@id = '" + valor + "']"));			
			}catch (NoSuchElementException f){
				button = driver.findElement(By.xpath("//"+elemento+"[@name = '" + valor + "']"));
			}
		}
				
		button.click();
	}
	
	@And ("^seleciona varios select do combobox com id \"([^\"]*)\"$")
	public void serlecionaVariosCombobox(String id) throws Throwable {
		
		Select oMulitpleSelection = new Select(driver.findElement(By.id(id)));
		List<WebElement> lista = oMulitpleSelection.getOptions();
		
		/*
		Keyboard keyboard = ((HasInputDevices) driver).getKeyboard();
		keyboard.pressKey(Keys.chord(Keys.CONTROL));
				
		for (int i = 0; i < lista.size(); i++) {
			option = driver.findElement(By.id("m_opt_"+i));  //m_opt_0
			option.click();
		}
		*/
		Random gerador = new Random();
		int qtde = 1;
		
		do{
			 qtde = gerador.nextInt(lista.size()-1);
		}while (qtde == 0); 
			
		
		System.out.println(" num gerado" + qtde);
		for (int i = 0; i < qtde; i++) {
			int item = gerador.nextInt(qtde);
			oMulitpleSelection.selectByIndex(item);
		}
		
		//oMulitpleSelection.selectByIndex(3); // April
	    //oMulitpleSelection.selectByValue("Aug"); // Select <option ... value="Aug">...</option>
	    //oMulitpleSelection.selectByVisibleText("November"); // Select <option ...>November</option>
		
	}
	
	//---------------------------------------------------------------------------------------
	
	@And ("^usuario seleciona varios valores do combobox com \\s*(class|name|id)\\s*=\\s*\"(.+)\"$")
	public void serlecionaVariosCombobox(String atributo, String text) throws Throwable {
		List<WebElement> lista = null;
		Select oMulitpleSelection = null;
		
		try {
			
			Thread.sleep(1000);
			if (atributo.equals("id")) {
				 oMulitpleSelection = new Select(driver.findElement(By.id(text)));
				 lista = oMulitpleSelection.getOptions();
			} else if (atributo.equals("name")) {
				 oMulitpleSelection = new Select(driver.findElement(By.name(text)));
				 lista = oMulitpleSelection.getOptions();
			} else if (atributo.equals("class")) {
				 oMulitpleSelection = new Select(driver.findElement(By.className(text)));
				 lista = oMulitpleSelection.getOptions();
			}
			
			Random gerador = new Random();
			int tamanhoLista = 0;
		
			tamanhoLista = lista.size();
				
			if(tamanhoLista == 2){
				oMulitpleSelection.selectByIndex(0);
				oMulitpleSelection.selectByIndex(1);		
			}else if (tamanhoLista == 1){
				oMulitpleSelection.selectByIndex(0);	
			}else{
				for (int i = 0; i < tamanhoLista; i++) {
					int item = gerador.nextInt(tamanhoLista);
					oMulitpleSelection.selectByIndex(item);
				}
			}
			
		} catch (NoSuchElementException e) {
			//fail("Não encontrou o elemento especificado");
			System.out.println(e.getMessage() + " ou seja - Não encontrou o elemento especificado");
		}
	}
	
	@Given("^verifica itens selecionados no combobox com tag \"([^\"]*)\" e valor \"([^\"]*)\"$")
	public void verificaItensSelecionadosNoCombobox (String tag, String valor) throws Throwable {
		
		Select oMulitpleSelection;
		
		try{
			 oMulitpleSelection = new Select(driver.findElement(By.xpath("//"+tag+"[@id = '" + valor + "']")));	
		}catch (NoSuchElementException e) {
			oMulitpleSelection = new Select(driver.findElement(By.xpath("//"+tag+"[@name = '" + valor + "']")));
		}
		
		List<WebElement> lista = oMulitpleSelection.getAllSelectedOptions();
		System.out.println( lista.size() + " ITENS SELECIONADOS:");
		for (WebElement x : lista) {
			System.out.println( x.getText());
		}
		
	}
	
	public int quantidadeDeIitensSelecionadosNoCombobox (String tag, String valor) throws Throwable {
		
		Select oMulitpleSelection;
		
		try{
			 oMulitpleSelection = new Select(driver.findElement(By.xpath("//"+tag+"[@id = '" + valor + "']")));	
		}catch (NoSuchElementException e) {
			oMulitpleSelection = new Select(driver.findElement(By.xpath("//"+tag+"[@name = '" + valor + "']")));
		}
		
		List<WebElement> lista = oMulitpleSelection.getAllSelectedOptions();
		return lista.size();
	}
	
	@And("^verifica se selecionou mais de um item no combobox com tag \"([^\"]*)\" e valor \"([^\"]*)\"$")
	public void verificaSeSelecionouMaisDeUmItem (String tag, String valor) throws Throwable {
		
		Select oMulitpleSelection;
		
		try{
			 oMulitpleSelection = new Select(driver.findElement(By.xpath("//"+tag+"[@id = '" + valor + "']")));	
		}catch (NoSuchElementException e) {
			oMulitpleSelection = new Select(driver.findElement(By.xpath("//"+tag+"[@name = '" + valor + "']")));
		}
		
		List<WebElement> listaDeOpcoes = oMulitpleSelection.getOptions();
		List<WebElement> listaSelecionados = oMulitpleSelection.getAllSelectedOptions();
		
		int quantidade = 0;
		
		if (listaDeOpcoes.size() > 1){
			if (listaSelecionados.size() > 1){
				quantidade = 1;
			}		
			Assert.assertEquals(1, quantidade);	
		}
			
	}
//-------------------------------------------------------------------------------
	
	@And("^clica no link para abrir outra pagina \"([^\"]*)\" com valor \"([^\"]*)\"$")
	public void clicaNolink (String elemento, String valor) throws Throwable {
		WebElement button;
		
		pegaInstanciaJanelaAtual();
		try{
			button = driver.findElement(By.xpath("//"+elemento+"[text() = '" + valor + "']"));
		}catch (NoSuchElementException e) {
			try{
				button = driver.findElement(By.xpath("//"+elemento+"[@id = '" + valor + "']"));			
			}catch (NoSuchElementException f){
				button = driver.findElement(By.xpath("//"+elemento+"[@name = '" + valor + "']"));
			}
		}
				
		button.click();
		Thread.sleep(4000);
	}
	
	@When("esperando")
	public void esperando() {
		try {
			Thread.sleep(3000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	
	@Given("^pega a instancia da janela atual $")
	public void pegaInstanciaJanelaAtual() throws Throwable {
		
		 winHandleBefore = driver.getWindowHandle();
		
	}
	
	@Given("^volta para a pagina inicial$")
	public void voltaParaPaginaInicial() throws Throwable {
		
		driver.switchTo().window(winHandleBefore);
		
	}
	//Ex: And aciona o elemento com tag "input" e valor "cmdVoltar"
	//EX: And aciona o elemento com tag "a" e valor "Clique no link"
	@Given ("^aciona o elemento com tag \"([^\"]*)\" e valor \"([^\"]*)\"$")
	public void acionaElemento (String tag, String valor) throws Throwable {
		WebElement elemento =null;
		elemento  = retornaElemento(tag, valor);
		elemento.click();	
	}
		
   //EX: Given espera carregar "a" com identificador "alelo" no máximo "300" segundos
	@Given ("^espera carregar \"([^\"]*)\" com identificador \"([^\"]*)\" no máximo \"([^\"]*)\" segundos$")
	public void esperaIdentificador (String tag, String identificador,String segundos) throws Throwable {
		
		Integer cont = Integer.parseInt(segundos);
		if (cont == 0){
			fail("Não carregou o elemento no tempo estimado");
		}else{
			cont--;
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			
			WebElement elemento =null;
			try{
				elemento = driver.findElement(By.xpath("//"+tag+"[@id = '" + identificador + "']"));
			}catch (NoSuchElementException e) {
				try{
					elemento = driver.findElement(By.xpath("//"+tag+"[@name = '" + identificador + "']"));
				}catch (NoSuchElementException ex) {
					try{
						elemento = driver.findElement(By.xpath("//"+tag+"[@src = '" + identificador + "']"));
					}catch (NoSuchElementException exc) {
						try{
							elemento = driver.findElement(By.xpath("//"+tag+"[text() = '" + identificador + "']"));
						}catch (NoSuchElementException exce) {
							System.out.println( " SEGUNDOS : " + cont.toString());
							esperaIdentificador(tag, identificador, cont.toString());
						}
					}		
				}	
			}
		}
			
	}
	
		
	// Parametros do metodo: Passar "checkbox" ou "radio"
    //Ex: And retorna elementos selecionados com identificador "checkbox"
	@Given ("^retorna elementos selecionados com identificador \"([^\"]*)\"$")
	public void retornaElementosSelecionados(String identificador) throws Throwable {
		List<WebElement> listaElementos =null;
		try{
			listaElementos = driver.findElements(By.xpath("//input[@type = '" + identificador + "']"));
		}catch (NoSuchElementException e) {
		    	fail("Não encontrou o elemento");
		}	
		
		for (WebElement elemento : listaElementos) {
			if(elemento.isSelected()){
				System.out.println("Elemento selecionado " + elemento.getAttribute("name"));
			}
		}
	}
		
	//Ex: And verifica se campo com identificador "checkbox" foi preenchido
	@Given ("^verifica se campo com identificador \"([^\"]*)\" foi preenchido$")
	public void verificaCampoPreenchido(String identificador) throws Throwable {
		WebElement elemento =null;
		elemento = retornaElemento("input", identificador);
		
		String x = "teste";
		System.out.println("Antes x = : " + x.length());
		x = x + elemento.getAttribute("value");
		System.out.println("Depois x = : " + x.length());
		
		System.out.println("GET ATRIBUTE VALUE: " + elemento.getAttribute("value"));
		System.out.println("GET ATRIBUTE .LEGTH: " + elemento.getAttribute("value").equals(""));
		
		
	}
		
	//EX: And clica no ícone com src "algo\algo.gig" posicao "2" da tabela "identificador" com diferença de "1"
    @Then("^clica no ícone com src \"([^\"]*)\" posicao \"([^\"]*)\" da tabela \"([^\"]*)\" com diferença de \"([^\"]*)\"$" )
    public void clicarNoIcone(String src, String posicao,String identificador_tabela, String diferenca) throws Throwable {
        int tamanhoLista = 0, retornaLinha = 0;; 
        Integer item = 0, dif= 0;
        WebElement tabela = null, linha = null;
        List<WebElement> linhasDaTabela, celulasDaLinha = null;
        //CRIAR ESSA VARIAVEL NO INICIO DA CLASSE
        //List<String> informaçõesDaLinha = new ArrayList<>(); 

        try{
            List <WebElement> elemento = driver.findElements(By.xpath("//img[@src = '" + src + "']"));
            if (posicao.equals("aleatorio")){
                    tamanhoLista = elemento.size();
                    item = (int)((Math.random() * tamanhoLista));
                    System.out.println("num gerado " + item);
            }else{
                    item = Integer.valueOf(posicao);
            }
            System.out.println("NUMERO GERADO " + item);
            System.out.println(" TODOS OS ELEMENTOS" + tamanhoLista);

            try{
                    tabela = driver.findElement(By.xpath("//table[@id = '" + identificador_tabela + "']"));
            }catch (NoSuchElementException e) {
                    try{
                            tabela = driver.findElement(By.xpath("//table[@name = '" + identificador_tabela + "']"));
                    }catch (NoSuchElementException ex) {
                            fail("Não encontrou a tabela com o identificador" + identificador_tabela);

                    }	
            }						

            linhasDaTabela = tabela.findElements(By.tagName("tr"));

            dif = Integer.parseInt(diferenca);
            retornaLinha = dif + item;
            System.out.println("LINHAS DA TABELA : ");
            int cont = 0;
            for (WebElement tr : linhasDaTabela) {
                if (retornaLinha == cont){
                    System.out.println("TR(s) da tabela " + tr.getText());
                    //Pegando todas as td(s) da linha
                    celulasDaLinha = tr.findElements(By.tagName("td"));

                }
                cont++;
            }

            for (WebElement td : celulasDaLinha) {
                System.out.println("CELULA da LINHA " + td.getText());
                informaçõesDaLinha.add( td.getText() );
            }

            elemento.get(item).click();
        } catch(NoSuchElementException e){
                fail("Ícone não clicado corretamente");
        }
    }
									
 //EX:   And sistema verifica se existe o dado "nome" referente ao ícone clicado			
    @Given("^sistema verifica se existe o dado \"([^\"]*)\" referente ao ícone clicado$")			
    public void verificaIconeClicado (String dado) throws Throwable {
        try {
            Assert.assertEquals(true, this.informaçõesDaLinha.contains(dado));
            informaçõesDaLinha.clear();
        } catch (AssertionError e) {
            fail("Não existe este dado ( " +dado+" ) na linha clicada");
            informaçõesDaLinha.clear();
        }
    }
	
	
   //EX: And posiciona o mouse no elemento com tag "a" e valor "Rent a Car"	
	@Given("^posiciona o mouse no elemento com tag \"([^\"]*)\" e valor \"([^\"]*)\"$")
	public void posicionaMouse(String tag, String valor) throws Throwable {
		Actions actions = new Actions(driver);
		WebElement elemento =null, elemento2 = null ;
		elemento = retornaElemento(tag, valor);
		actions.moveToElement(elemento).build().perform();
		esperando();
		
	}
				
	/*
	   Actions builder = new Actions(driver);

	   Action dragAndDrop = builder.clickAndHold(someElement)
	       .moveToElement(otherElement)
	       .release(otherElement)
	       .build();
	
	   dragAndDrop.perform(); 
	 
			 */
			 
	//Método que retorna um elemento a partir de uma tag e um identificador
	//EX: retornaElemento( "input", "id_input");
	public WebElement retornaElemento (String tag, String identificador) throws Throwable {
		WebElement elemento =null;
		try{
			elemento = driver.findElement(By.xpath("//"+tag+"[@id = '" + identificador + "']"));
			return elemento;
		}catch (NoSuchElementException e) {
			try{
				elemento = driver.findElement(By.xpath("//"+tag+"[@name = '" + identificador + "']"));
				return elemento;
			}catch (NoSuchElementException ex) {
				try{
					elemento = driver.findElement(By.xpath("//"+tag+"[@class = '" + identificador + "']"));
					return elemento;
				}catch (NoSuchElementException exc) {
					try{
						elemento = driver.findElement(By.xpath("//"+tag+"[@src = '" + identificador + "']"));
						return elemento;
					}catch (NoSuchElementException exce) {
						try{
							elemento = driver.findElement(By.xpath("//"+tag+"[text() = '" + identificador + "']"));
							return elemento;
						}catch (NoSuchElementException excec) {
							System.out.println( "Não encontrou o elemento com TAG ( '" + tag + "' ) e identificador ( '" + identificador + "' ) ");
							return null;
						}
					}		
				}	
			}
		}
	}
		
	//Método que retorna um elemento a partir de uma tag e um identificador
	//EX: retornaElemento( "input", "id_input");
	public List<WebElement> retornaListaElementos (String tag, String identificador) throws Throwable {
		List<WebElement> elementos =null;
		try {
			elementos = driver.findElements(By.xpath("//"+tag+"[@type = '" + identificador + "']"));
			return elementos;
		} catch (Exception e) {
			try{
				elementos = driver.findElements(By.xpath("//"+tag+"[@id = '" + identificador + "']"));
				return elementos;
			}catch (NoSuchElementException ex) {
				try{
					elementos = driver.findElements(By.xpath("//"+tag+"[@name = '" + identificador + "']"));
					return elementos;
				}catch (NoSuchElementException exc) {
					try{
						elementos = driver.findElements(By.xpath("//"+tag+"[@class = '" + identificador + "']"));
						return elementos;
					}catch (NoSuchElementException exce) {
						try{
							elementos = driver.findElements(By.xpath("//"+tag+"[@src = '" + identificador + "']"));
							return elementos;
						}catch (NoSuchElementException excep) {
							try{
								elementos = driver.findElements(By.xpath("//"+tag+"[text() = '" + identificador + "']"));
								return elementos;
							}catch (NoSuchElementException excec) {
								System.out.println( "Não encontrou o elemento com TAG ( : '" + tag + "' ) e identificador ( '" + identificador + "' ) ");
								return null;
							}
						}		
					}	
				}
			}
		}	
	}
				
				
				
				
	//EX: And clica na tag "img" com identificador "algo\algo.gig" e posicao "2" da tabela "identificador" com diferença de "1"
    @Given("^clica na tag \"([^\"]*)\" com identificador \"([^\"]*)\" e posicao \"([^\"]*)\" da tabela \"([^\"]*)\" com diferença de \"([^\"]*)\"$" )
    public void clicarNoIconeDaTabela(String tag, String identificador, String posicao,String identificador_tabela, String diferenca) throws Throwable {
        int tamanhoLista = 0, retornaLinha = 0; 
        Integer item = 0, dif= 0;
        WebElement tabela = null;
        List<WebElement> linhasDaTabela, celulasDaLinha = null;
        
        try{
            List <WebElement> elementos = retornaListaElementos(tag, identificador);
            if (posicao.equals("aleatorio")){
                    tamanhoLista = elementos.size();
                    item = (int)((Math.random() * tamanhoLista));
                    System.out.println("num gerado " + item);
            }else{
                    item = Integer.valueOf(posicao);
            }
            System.out.println("NUMERO GERADO " + item);
            System.out.println(" TODOS OS ELEMENTOS" + tamanhoLista);

            tabela = retornaElemento("table", identificador_tabela);

            linhasDaTabela = tabela.findElements(By.tagName("tr"));

            dif = Integer.parseInt(diferenca);
            retornaLinha = dif + item;
            System.out.println("LINHAS DA TABELA : ");
            int cont = 0;
            for (WebElement tr : linhasDaTabela) {
                if (retornaLinha == cont){
                    System.out.println("TR(s) da tabela " + tr.getText());
                    //Pegando todas as td(s) da linha
                    celulasDaLinha = tr.findElements(By.tagName("td"));

                }
                cont++;
            }

            for (WebElement td : celulasDaLinha) {
                System.out.println("CELULA da LINHA " + td.getText());
                //informaçõesDaLinha.add( td.getText() );
            }

            elementos.get(item).click();
        } catch(NoSuchElementException e){
                fail("Ícone não clicado corretamente");
        }
    }
			
				
    @Given ("^pressiona ctrl P$")
	public void ctrlP() throws Throwable {
        	  
		Keyboard keyboard = ((HasInputDevices) driver).getKeyboard();
	
		keyboard.pressKey(Keys.chord(Keys.CONTROL, "p"));
		
    }
    
    @Given ("^pressiona tab$")
	public void tab() throws Throwable {
		Keyboard keyboard = ((HasInputDevices) driver).getKeyboard();
	
		//keyboard.pressKey(Keys.chord(Keys.CONTROL, "p"));
		keyboard.pressKey(Keys.TAB);

    }
    @Given ("^foco na impressora$")
	public void focoImpressora() throws Throwable {
    	Robot r = new Robot();
    	r.keyPress(KeyEvent.VK_ESCAPE);
    	r.keyRelease(KeyEvent.VK_ESCAPE);
    	
    	

    }
    
    @Given ("^move o mouse$")
	public void move() throws Throwable {
    	Point coordinates;  
    	//coordinates = driver.findElement(By.id("gbqfsb")).getLocation();
    	Robot robot = new Robot();
    	robot.mouseMove(300 ,500);
    	robot.mousePress(InputEvent.BUTTON1_MASK);
    	robot.mouseRelease(InputEvent.BUTTON1_MASK);
    }
    
    @Given("^executa o arquivo \"([^\"]*)\"$")
    public void executeScript(String scriptPath) throws IOException{
    	Runtime.getRuntime().exec(scriptPath);
    }	
				
    		
}
